package com.robertux.leaderboard.util;

import java.util.Arrays;
import java.util.List;

import com.robertux.leaderboard.beans.EstadoEntidad;
import com.robertux.leaderboard.beans.entities.Rol;
import com.robertux.leaderboard.beans.entities.Usuario;
import com.robertux.leaderboard.util.gestoresModelos.GestorUsuarios;


public class UsersFileContentHandler extends FileContentHandler {
	private GestorUsuarios gUsr;
	private String defaultPassword = "prueba123";
	
	public UsersFileContentHandler() {
		super("/Leaderboard/admin/adminUsers.html", 
				new String[]{"Nombre empleado", "Usuario", "ID Sucursal", "ID Vendedor", "ID Rol", "ID Empleado", "No utilizar esta columna"});
		
		this.gUsr = new GestorUsuarios();
	}

	@Override
	public String[] handleFileContent(String[][] fileContent, String[] discardedRows, String[] mappedColumns) {
		String[] results = new String[fileContent.length];
		
		List<String> lstDiscardedRows = Arrays.asList(discardedRows);
		
		for(int i=0; i<fileContent.length; i++) {
			String result = "";
			if(!lstDiscardedRows.contains(String.valueOf(i))) {
				try {
					Usuario usr = this.createUsuario(fileContent[i], mappedColumns);
					if(usr != null) {
						Usuario existente = this.gUsr.getUsuario(usr.getUsuario());
						
						if(existente != null && existente.getEstado() != EstadoEntidad.ELIMINADO.getCodigo()) { //Modificar usuario activo
							this.updateUsuarioExistente(existente, usr);
							if(this.gUsr.actualizarUsuario(existente)) {
								result = "OK - Usuario existente actualizado";
							} else {
								result = "ERROR - No se pudo actualizar usuario existente";
							}
						} else { //Agregar nuevo usuario
							if(this.gUsr.agregarUsuario(usr)) {
								result = "OK - Nuevo usuario agregado";
							} else {
								result = "ERROR - No se pudo insertar nuevo usuario";
							}
						}
					} else {
						result = "ERROR - No se pudo construir un usuario a partir de los datos ingresados";
					}
					
				} catch (Exception e) {
					this.logger.error("Error tratando de construir usuario con las columnas " + Arrays.toString(fileContent[i]) + ": " + e.getMessage(), e);
					result = "ERROR - Error tratando de insertar usuario: " + e.getMessage();
				}
			}
			results[i] = result;
		}
		
		return results;
	}
	
	private Usuario createUsuario(String[] contentRow, String[] mappedColumns) {
		Usuario usr = new Usuario();
		List<String> lstColumns = Arrays.asList(mappedColumns);
		int index = 0;
		
		index = lstColumns.indexOf("Usuario");
		if(index >= 0 && index < contentRow.length) {
			this.logger.debug("Usuario: " + contentRow[index]);
			usr.setUsuario(contentRow[index]);
		}
		
		index = lstColumns.indexOf("Nombre empleado");
		if(index >= 0 && index < contentRow.length) {
			this.logger.debug("Nombre empleado: " + contentRow[index]);
			usr.setNombre(contentRow[index]);
		}
		
		index = lstColumns.indexOf("ID Sucursal");
		if(index >= 0 && index < contentRow.length) {
			try {
				this.logger.debug("ID Sucursal: " + contentRow[index]);
				usr.setSucursalId(Integer.parseInt(contentRow[index]));
			} catch (Exception e) {
				this.logger.error("Error tratando de convertir a entero el ID de la sucursal " + contentRow[index] + ": " + e.getMessage(), e);
			}
		}
		
		index = lstColumns.indexOf("ID Vendedor");
		if(index >= 0 && index < contentRow.length) {
			this.logger.debug("ID Vendedor: " + contentRow[index]);
			usr.setVendedorId(contentRow[index]);
		}
		
		index = lstColumns.indexOf("ID Rol");
		if(index >= 0 && index < contentRow.length) {
			try {
				this.logger.debug("ID Rol: " + contentRow[index]);
				int rolLevel = Integer.parseInt(contentRow[index]);
				Rol rol = this.gUsr.getRolFromLevel(rolLevel);
				usr.setRol(rol);
			} catch (Exception e) {
				this.logger.error("Error tratando de asignar Rol a usuario en base al valor " + contentRow[index] + ": " + e.getMessage(), e);
			}
		}
		
		index = lstColumns.indexOf("ID Empleado");
		if(index >= 0 && index < contentRow.length) {
			this.logger.debug("ID Empledo: " + contentRow[index]);
			usr.setEmpleadoId(contentRow[index]);
		}
		
		if(usr.getUsuario() == null || usr.getUsuario().trim().length() == 0 || usr.getNombre() == null || usr.getNombre().trim().length() == 0
				|| usr.getSucursalId() == 0 || usr.getVendedorId() == null || usr.getVendedorId().trim().length() == 0
				|| usr.getRol() == null || usr.getEmpleadoId() == null || usr.getEmpleadoId().trim().length() == 0) {
			return null;
		}
		
		usr.setClave(this.defaultPassword);
		usr.setEstado(EstadoEntidad.ACTIVO.getCodigo());
		this.logger.debug("Usuario construido: " + usr);
		return usr;
	}
	
	private void updateUsuarioExistente(Usuario existente, Usuario usr) {
		if(usr.getEmpleadoId() != null && usr.getEmpleadoId().trim().length() > 0) {
			existente.setEmpleadoId(usr.getEmpleadoId());
		}
		
		if(usr.getNombre() != null && usr.getNombre().trim().length() > 0) {
			existente.setNombre(usr.getNombre());
		}
		
		if(usr.getRol() != null) {
			existente.setRol(usr.getRol());
		}
		
		if(usr.getSucursalId() > 0) {
			existente.setSucursalId(usr.getSucursalId());
		}
		
		if(usr.getVendedorId() != null && usr.getVendedorId().trim().length() > 0) {
			existente.setVendedorId(usr.getVendedorId());
		}
		this.logger.debug("Usuario actualizado: " + existente);
	}

}
